<?php

namespace app\service;

/**
 * 图像处理服务
 */
class ImageService
{
    // 名片图片宽度
    const CARD_WIDTH = 800;
    // 名片图片高度
    const CARD_HEIGHT = 500;
    // 公司Logo尺寸
    const LOGO_SIZE = 120;
    // 字体路径
    const FONT_PATH = __DIR__ . '/../../public/static/fonts/simhei.ttf';
    // 输出目录
    const OUTPUT_DIR = __DIR__ . '/../../public/upload/cards/';

    /**
     * 创建名片图片
     * @param array $cardData 名片数据
     * @return string 图片文件路径
     */
    public function createCardImage(array $cardData)
    {
        // 检查并创建输出目录
        $this->checkOutputDir();

        // 获取模板类型，默认为classic
        $template = $cardData['template'] ?? 'classic';

        // 根据模板类型创建对应的名片
        $image = $this->createTemplateImage($cardData, $template);

        // 生成文件名
        $filename = 'card_' . $template . '_' . md5(json_encode($cardData) . time()) . '.png';
        $filePath = self::OUTPUT_DIR . $filename;

        // 保存图片
        imagepng($image, $filePath, 9); // 最高质量

        // 释放资源
        imagedestroy($image);

        // 返回可访问的URL路径
        return '/upload/cards/' . $filename;
    }

    /**
     * 根据模板类型创建名片图片
     * @param array $cardData 名片数据
     * @param string $template 模板类型
     * @return resource 图像资源
     */
    private function createTemplateImage(array $cardData, string $template)
    {
        switch ($template) {
            case 'modern':
                return $this->createModernTemplate($cardData);
            case 'elegant':
                return $this->createElegantTemplate($cardData);
            case 'creative':
                return $this->createCreativeTemplate($cardData);
            case 'minimal':
                return $this->createMinimalTemplate($cardData);
            case 'gradient':
                return $this->createGradientTemplate($cardData);
            case 'classic':
            default:
                return $this->createClassicTemplate($cardData);
        }
    }

    /**
     * 创建经典商务模板
     * @param array $cardData 名片数据
     * @return resource 图像资源
     */
    private function createClassicTemplate(array $cardData)
    {
        // 创建画布
        $image = imagecreatetruecolor(self::CARD_WIDTH, self::CARD_HEIGHT);
        imageantialias($image, true);

        // 定义配色方案
        $colors = $this->defineColorPalette($image);

        // 创建白色背景
        imagefill($image, 0, 0, $colors['white']);

        // 绘制顶部装饰带
        imagefilledrectangle($image, 0, 0, self::CARD_WIDTH, 8, $colors['primary']);

        // 绘制公司Logo和信息
        $this->drawCompanySection($image, $cardData, $colors);

        // 绘制分割线
        imageline($image, 50, 140, self::CARD_WIDTH - 50, 140, $colors['lightGray']);

        // 绘制个人信息
        $this->drawPersonalInfo($image, $cardData, $colors, 50, 180);

        return $image;
    }

    /**
     * 创建现代简约模板
     * @param array $cardData 名片数据
     * @return resource 图像资源
     */
    private function createModernTemplate(array $cardData)
    {
        // 创建画布
        $image = imagecreatetruecolor(self::CARD_WIDTH, self::CARD_HEIGHT);
        imageantialias($image, true);

        // 创建渐变背景
        $this->createModernGradientBackground($image);

        // 定义配色方案
        $white = imagecolorallocate($image, 255, 255, 255);
        $lightWhite = imagecolorallocatealpha($image, 255, 255, 255, 30);

        // 绘制左侧信息区域
        $this->drawModernLeftSection($image, $cardData, $white, $lightWhite);

        // 绘制右侧联系信息
        $this->drawModernRightSection($image, $cardData, $white, $lightWhite);

        return $image;
    }

    /**
     * 创建优雅风格模板
     * @param array $cardData 名片数据
     * @return resource 图像资源
     */
    private function createElegantTemplate(array $cardData)
    {
        // 创建画布
        $image = imagecreatetruecolor(self::CARD_WIDTH, self::CARD_HEIGHT);
        imageantialias($image, true);

        // 定义优雅配色
        $white = imagecolorallocate($image, 255, 255, 255);
        $gold = imagecolorallocate($image, 212, 175, 55);
        $darkGray = imagecolorallocate($image, 44, 62, 80);
        $lightGray = imagecolorallocate($image, 149, 165, 166);

        // 创建白色背景
        imagefill($image, 0, 0, $white);

        // 绘制金色边框
        $this->drawElegantBorder($image, $gold);

        // 居中绘制信息
        $this->drawElegantContent($image, $cardData, $darkGray, $gold, $lightGray);

        return $image;
    }

    /**
     * 创建创意设计模板
     * @param array $cardData 名片数据
     * @return resource 图像资源
     */
    private function createCreativeTemplate(array $cardData)
    {
        // 创建画布
        $image = imagecreatetruecolor(self::CARD_WIDTH, self::CARD_HEIGHT);
        imageantialias($image, true);

        // 创建创意渐变背景
        $this->createCreativeGradientBackground($image);

        // 定义配色
        $white = imagecolorallocate($image, 255, 255, 255);
        $lightWhite = imagecolorallocatealpha($image, 255, 255, 255, 30);

        // 绘制几何装饰元素
        $this->drawCreativeDecorations($image);

        // 绘制内容
        $this->drawCreativeContent($image, $cardData, $white, $lightWhite);

        return $image;
    }

    /**
     * 创建极简风格模板
     * @param array $cardData 名片数据
     * @return resource 图像资源
     */
    private function createMinimalTemplate(array $cardData)
    {
        // 创建画布
        $image = imagecreatetruecolor(self::CARD_WIDTH, self::CARD_HEIGHT);
        imageantialias($image, true);

        // 定义极简配色
        $white = imagecolorallocate($image, 255, 255, 255);
        $darkGray = imagecolorallocate($image, 44, 62, 80);
        $lightGray = imagecolorallocate($image, 149, 165, 166);
        $accent = imagecolorallocate($image, 52, 152, 219);

        // 创建白色背景
        imagefill($image, 0, 0, $white);

        // 绘制极简内容
        $this->drawMinimalContent($image, $cardData, $darkGray, $lightGray, $accent);

        return $image;
    }

    /**
     * 创建渐变时尚模板
     * @param array $cardData 名片数据
     * @return resource 图像资源
     */
    private function createGradientTemplate(array $cardData)
    {
        // 创建画布
        $image = imagecreatetruecolor(self::CARD_WIDTH, self::CARD_HEIGHT);
        imageantialias($image, true);

        // 创建多彩渐变背景
        $this->createMultiGradientBackground($image);

        // 定义配色
        $white = imagecolorallocate($image, 255, 255, 255);
        $lightWhite = imagecolorallocatealpha($image, 255, 255, 255, 30);

        // 绘制渐变内容
        $this->drawGradientContent($image, $cardData, $white, $lightWhite);

        return $image;
    }

    /**
     * 定义现代化配色方案
     * @param resource $image 图像资源
     * @return array 颜色数组
     */
    private function defineColorPalette(&$image)
    {
        return [
            'primary' => imagecolorallocate($image, 26, 188, 156),      // 优雅的蓝绿色
            'secondary' => imagecolorallocate($image, 52, 73, 94),      // 深蓝灰色
            'accent' => imagecolorallocate($image, 241, 196, 15),       // 金黄色
            'danger' => imagecolorallocate($image, 231, 76, 60),        // 珊瑚红
            'white' => imagecolorallocate($image, 255, 255, 255),       // 纯白
            'lightGray' => imagecolorallocate($image, 245, 246, 250),   // 极浅灰
            'mediumGray' => imagecolorallocate($image, 149, 165, 166),  // 中灰
            'darkGray' => imagecolorallocate($image, 44, 62, 80),       // 深灰
            'text' => imagecolorallocate($image, 47, 54, 64),           // 深色文字
            'shadow' => imagecolorallocate($image, 0, 0, 0),            // 阴影色
            'gradient1' => imagecolorallocate($image, 116, 185, 255),   // 渐变色1
            'gradient2' => imagecolorallocate($image, 52, 152, 219),    // 渐变色2
        ];
    }

    /**
     * 创建渐变背景
     * @param resource $image 图像资源
     * @param array $colors 颜色配置
     */
    private function createGradientBackground(&$image, array $colors)
    {
        // 首先填充白色背景
        imagefill($image, 0, 0, $colors['white']);

        // 简化的背景装饰 - 只绘制一个微妙的装饰元素
        $lightAccent = imagecolorallocatealpha($image, 52, 152, 219, 120);
        if ($lightAccent !== false) {
            imagefilledellipse($image, self::CARD_WIDTH - 100, 50, 80, 80, $lightAccent);
        }
    }

    /**
     * 绘制主要装饰元素
     * @param resource $image 图像资源
     * @param array $colors 颜色配置
     */
    private function drawMainDecorations(&$image, array $colors)
    {
        // 绘制优雅的左侧装饰带
        $this->drawRoundedRect($image, 0, 0, 12, self::CARD_HEIGHT, 6, $colors['primary']);
        
        // 绘制顶部装饰带
        $this->drawRoundedRect($image, 0, 0, self::CARD_WIDTH, 8, 4, $colors['primary']);
        
        // 绘制右上角装饰圆形
        $this->drawSoftCircle($image, self::CARD_WIDTH - 60, 60, 40, $colors['accent'], 30);
        
        // 绘制左下角几何装饰
        $this->drawGeometricDecoration($image, $colors);
    }

    /**
     * 绘制公司信息区域
     * @param resource $image 图像资源
     * @param array $cardData 名片数据
     * @param array $colors 颜色配置
     */
    private function drawCompanySection(&$image, array $cardData, array $colors)
    {
        $logoX = 40;
        $logoY = 30;
        
        // 绘制Logo区域的阴影效果
        $this->drawSoftShadow($image, $logoX + 2, $logoY + 2, self::LOGO_SIZE, self::LOGO_SIZE);
        
        // 绘制Logo
        $this->drawPremiumLogo($image, $logoX, $logoY, $colors);

        // 公司信息区域
        $companyX = $logoX + self::LOGO_SIZE + 30;
        $companyY = 50;
        
        // 公司名称 - 使用渐变效果
        $this->drawGradientText($image, $cardData['company_name'], $colors['secondary'], 24, $companyX, $companyY, true);
        
        // 公司地址
        $this->drawStyledText($image, $cardData['company_address'], $colors['mediumGray'], 14, $companyX, $companyY + 40);
        
        // 添加小图标装饰
        $this->drawLocationIcon($image, $companyX - 20, $companyY + 35, $colors['accent']);
    }

    /**
     * 绘制优雅的分割线
     * @param resource $image 图像资源
     * @param array $colors 颜色配置
     */
    private function drawElegantDivider(&$image, array $colors)
    {
        $y = 140;
        $startX = 50;
        $endX = self::CARD_WIDTH - 50;
        
        // 绘制主分割线
        $this->drawGradientLine($image, $startX, $y, $endX, $y, $colors['primary'], $colors['lightGray']);
        
        // 添加装饰性小圆点
        for ($i = 0; $i < 3; $i++) {
            $x = $startX + ($endX - $startX) / 4 * ($i + 1);
            $this->drawSoftCircle($image, $x, $y, 4, $colors['accent'], 20);
        }
    }

    /**
     * 绘制个人信息卡片
     * @param resource $image 图像资源
     * @param array $cardData 名片数据
     * @param array $colors 颜色配置
     */
    private function drawPersonalInfoCard(&$image, array $cardData, array $colors)
    {
        // 个人信息卡片背景
        $cardX = 30;
        $cardY = 170;
        $cardWidth = 350;
        $cardHeight = 120;
        
        // 绘制卡片阴影
        $this->drawSoftShadow($image, $cardX + 3, $cardY + 3, $cardWidth, $cardHeight);
        
        // 绘制卡片背景
        $this->drawRoundedRect($image, $cardX, $cardY, $cardWidth, $cardHeight, 15, $colors['white']);
        
        // 绘制卡片边框
        $this->drawRoundedBorder($image, $cardX, $cardY, $cardWidth, $cardHeight, 15, $colors['lightGray']);
        
        // 绘制个人信息
        $infoX = $cardX + 25;
        $infoY = $cardY + 35;
        
        // 姓名 - 突出显示
        $this->drawHighlightText($image, $cardData['name'], $colors['secondary'], 20, $infoX, $infoY, $colors['accent']);
        
        // 部门和岗位
        $this->drawInfoWithIcon($image, '部门', $cardData['department'], $infoX, $infoY + 35, $colors);
        $this->drawInfoWithIcon($image, '岗位', $cardData['position'], $infoX, $infoY + 60, $colors);
    }

    /**
     * 绘制联系方式区域
     * @param resource $image 图像资源
     * @param array $cardData 名片数据
     * @param array $colors 颜色配置
     */
    private function drawContactSection(&$image, array $cardData, array $colors)
    {
        $contactX = 420;
        $contactY = 180;
        
        // 联系方式标题
        $this->drawStyledText($image, '联系方式', $colors['secondary'], 16, $contactX, $contactY, true);
        
        // 绘制联系信息
        $this->drawContactItem($image, '📞', $cardData['phone'], $contactX, $contactY + 40, $colors);
        $this->drawContactItem($image, '✉', $cardData['email'], $contactX, $contactY + 75, $colors);
        
        // 添加二维码占位符区域
        $this->drawQRPlaceholder($image, $contactX + 200, $contactY + 20, $colors);
    }

    /**
     * 绘制品牌底部元素
     * @param resource $image 图像资源
     * @param array $colors 颜色配置
     */
    private function drawBrandFooter(&$image, array $colors)
    {
        $footerY = self::CARD_HEIGHT - 40;
        
        // 绘制底部装饰线条
        $this->drawDecorativeLine($image, 50, $footerY, self::CARD_WIDTH - 100, $colors);
        
        // 绘制品牌水印
        $watermark = 'PROFESSIONAL BUSINESS CARD';
        $this->drawWatermark($image, $watermark, self::CARD_WIDTH - 200, self::CARD_HEIGHT - 15, $colors['mediumGray']);
        
        // 添加创建时间标记
        $timestamp = date('Y.m.d');
        $this->drawStyledText($image, $timestamp, $colors['mediumGray'], 10, 60, self::CARD_HEIGHT - 15);
    }

    /**
     * 输出图片到浏览器
     * @param string $imagePath 图片文件路径
     */
    public function outputImage(string $imagePath)
    {
        // 检查文件是否存在
        $fullPath = __DIR__ . '/../../public' . $imagePath;
        if (!file_exists($fullPath)) {
            throw new \Exception('图片文件不存在');
        }

        // 设置响应头
        header('Content-Type: image/png');
        header('Content-Disposition: inline; filename=' . basename($imagePath));

        // 输出图片
        readfile($fullPath);
        exit;
    }

    /**
     * 绘制软阴影效果
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param int $width 宽度
     * @param int $height 高度
     */
    private function drawSoftShadow(&$image, int $x, int $y, int $width, int $height)
    {
        // 简化的阴影效果
        $shadowColor = imagecolorallocatealpha($image, 0, 0, 0, 100);
        if ($shadowColor !== false) {
            $this->drawRoundedRect($image, $x + 2, $y + 2, $width, $height, 8, $shadowColor);
        }
    }

    /**
     * 绘制软圆形
     * @param resource $image 图像资源
     * @param int $centerX 中心X坐标
     * @param int $centerY 中心Y坐标
     * @param int $radius 半径
     * @param int $color 颜色
     * @param int $alpha 透明度
     */
    private function drawSoftCircle(&$image, int $centerX, int $centerY, int $radius, int $color, int $alpha = 0)
    {
        if ($alpha > 0 && $alpha < 127) {
            // 提取RGB值
            $r = ($color >> 16) & 0xFF;
            $g = ($color >> 8) & 0xFF;
            $b = $color & 0xFF;
            $softColor = imagecolorallocatealpha($image, $r, $g, $b, $alpha);
            if ($softColor !== false) {
                $color = $softColor;
            }
        }
        imagefilledellipse($image, $centerX, $centerY, $radius * 2, $radius * 2, $color);
    }

    /**
     * 绘制几何装饰
     * @param resource $image 图像资源
     * @param array $colors 颜色配置
     */
    private function drawGeometricDecoration(&$image, array $colors)
    {
        $baseX = 30;
        $baseY = self::CARD_HEIGHT - 80;
        
        // 绘制三个渐变大小的圆形
        $this->drawSoftCircle($image, $baseX, $baseY, 8, $colors['accent'], 40);
        $this->drawSoftCircle($image, $baseX + 25, $baseY + 15, 12, $colors['primary'], 60);
        $this->drawSoftCircle($image, $baseX + 50, $baseY - 10, 6, $colors['danger'], 50);
        
        // 添加装饰性线条
        imageline($image, $baseX + 15, $baseY - 5, $baseX + 40, $baseY + 10, $colors['mediumGray']);
    }

    /**
     * 绘制高级Logo
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param array $colors 颜色配置
     */
    private function drawPremiumLogo(&$image, int $x, int $y, array $colors)
    {
        // 检查是否有公司Logo文件
        $logoPath = __DIR__ . '/../../public' . $this->getLogoPath();
        if (file_exists($logoPath) && $this->isValidImage($logoPath)) {
            $logo = $this->loadImage($logoPath);
            if ($logo) {
                // 绘制圆角背景
                $this->drawRoundedRect($image, $x - 8, $y - 8, self::LOGO_SIZE + 16, self::LOGO_SIZE + 16, 20, $colors['white']);
                $this->drawRoundedBorder($image, $x - 8, $y - 8, self::LOGO_SIZE + 16, self::LOGO_SIZE + 16, 20, $colors['lightGray']);
                
                imagecopyresampled(
                    $image, $logo, $x, $y, 0, 0,
                    self::LOGO_SIZE, self::LOGO_SIZE,
                    imagesx($logo), imagesy($logo)
                );
                imagedestroy($logo);
                return;
            }
        }

        // 绘制高级默认Logo
        $this->drawPremiumDefaultLogo($image, $x, $y, $colors);
    }

    /**
     * 绘制高级默认Logo
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param array $colors 颜色配置
     */
    private function drawPremiumDefaultLogo(&$image, int $x, int $y, array $colors)
    {
        // 绘制主背景
        $this->drawRoundedRect($image, $x, $y, self::LOGO_SIZE, self::LOGO_SIZE, 20, $colors['primary']);
        
        // 绘制源变覆盖层
        $this->drawGradientOverlay($image, $x, $y, self::LOGO_SIZE, self::LOGO_SIZE, $colors);
        
        // 绘制中心X坐标
        $centerX = (int)($x + self::LOGO_SIZE / 2);
        $centerY = (int)($y + self::LOGO_SIZE / 2);
        
        // 主图标 - 现代化的公司标志
        imagefilledellipse($image, $centerX, $centerY - 15, 30, 30, $colors['white']);
        imagefilledellipse($image, $centerX - 20, $centerY + 10, 20, 20, $colors['accent']);
        imagefilledellipse($image, $centerX + 20, $centerY + 10, 20, 20, $colors['white']);
        
        // 添加公司名称缩写
        $this->drawStyledText($image, 'CORP', $colors['white'], 12, $x + 30, $y + 90, true);
    }

    /**
     * 绘制渐变覆盖层
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param int $width 宽度
     * @param int $height 高度
     * @param array $colors 颜色配置
     */
    private function drawGradientOverlay(&$image, int $x, int $y, int $width, int $height, array $colors)
    {
        for ($i = 0; $i < $height / 2; $i++) {
            $alpha = (int)(100 + ($i * 2));
            if ($alpha >= 0 && $alpha <= 127) {
                $overlayColor = imagecolorallocatealpha($image, 255, 255, 255, $alpha);
                if ($overlayColor !== false) {
                    imageline($image, $x, $y + $i, $x + $width, $y + $i, $overlayColor);
                }
            }
        }
    }

    /**
     * 绘制渐变文字
     * @param resource $image 图像资源
     * @param string $text 文字内容
     * @param int $color 文字颜色
     * @param int $fontSize 字体大小
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param bool $bold 是否加粗
     */
    private function drawGradientText(&$image, string $text, int $color, int $fontSize, int $x, int $y, bool $bold = false)
    {
        // 绘制阴影
        $shadowColor = imagecolorallocatealpha($image, 0, 0, 0, 100);
        $this->drawStyledText($image, $text, $shadowColor, $fontSize, $x + 2, $y + 2, $bold);
        
        // 绘制主文字
        $this->drawStyledText($image, $text, $color, $fontSize, $x, $y, $bold);
    }

    /**
     * 绘制高亮文字
     * @param resource $image 图像资源
     * @param string $text 文字内容
     * @param int $textColor 文字颜色
     * @param int $fontSize 字体大小
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param int $highlightColor 高亮颜色
     */
    private function drawHighlightText(&$image, string $text, int $textColor, int $fontSize, int $x, int $y, int $highlightColor)
    {
        // 绘制高亮背景
        $textWidth = (int)(strlen($text) * ($fontSize * 0.7));
        $this->drawRoundedRect($image, $x - 5, $y - $fontSize - 5, $textWidth + 10, $fontSize + 10, 5, $highlightColor);
        
        // 绘制文字
        $whiteColor = imagecolorallocate($image, 255, 255, 255);
        $this->drawStyledText($image, $text, $whiteColor, $fontSize, $x, $y, true);
    }

    /**
     * 绘制带图标的信息
     * @param resource $image 图像资源
     * @param string $label 标签
     * @param string $value 值
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param array $colors 颜色配置
     */
    private function drawInfoWithIcon(&$image, string $label, string $value, int $x, int $y, array $colors)
    {
        // 绘制小图标背景
        $this->drawSoftCircle($image, $x - 15, $y - 5, 6, $colors['primary'], 20);
        imagefilledellipse($image, $x - 15, $y - 5, 8, 8, $colors['primary']);
        
        // 绘制标签
        $this->drawStyledText($image, $label . ':', $colors['mediumGray'], 12, $x, $y);
        
        // 绘制值
        $labelWidth = strlen($label) * 8 + 15;
        $this->drawStyledText($image, $value, $colors['text'], 12, $x + $labelWidth, $y, true);
    }

    /**
     * 绘制联系项目
     * @param resource $image 图像资源
     * @param string $icon 图标
     * @param string $text 文字
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param array $colors 颜色配置
     */
    private function drawContactItem(&$image, string $icon, string $text, int $x, int $y, array $colors)
    {
        // 绘制图标背景
        $this->drawRoundedRect($image, $x - 5, $y - 12, 25, 25, 12, $colors['accent']);
        
        // 绘制图标（简化的emoji效果）
        $iconColor = imagecolorallocate($image, 255, 255, 255);
        $this->drawStyledText($image, $icon, $iconColor, 12, $x, $y);
        
        // 绘制文字
        $this->drawStyledText($image, $text, $colors['text'], 13, $x + 35, $y, true);
    }

    /**
     * 绘制二维码占位符
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param array $colors 颜色配置
     */
    private function drawQRPlaceholder(&$image, int $x, int $y, array $colors)
    {
        $size = 80;
        
        // 绘制二维码背景
        $this->drawRoundedRect($image, $x, $y, $size, $size, 8, $colors['lightGray']);
        
        // 绘制二维码图案
        for ($i = 0; $i < 8; $i++) {
            for ($j = 0; $j < 8; $j++) {
                if (($i + $j) % 2 == 0) {
                    $pixelSize = 6;
                    imagefilledrectangle($image, 
                        $x + 10 + $i * 8, $y + 10 + $j * 8,
                        $x + 10 + $i * 8 + $pixelSize, $y + 10 + $j * 8 + $pixelSize,
                        $colors['darkGray']
                    );
                }
            }
        }
        
        // 添加标签
        $this->drawStyledText($image, 'QR CODE', $colors['mediumGray'], 8, $x + 10, $y + $size + 10);
    }

    /**
     * 绘制装饰性线条
     * @param resource $image 图像资源
     * @param int $x 起始X坐标
     * @param int $y Y坐标
     * @param int $length 长度
     * @param array $colors 颜色配置
     */
    private function drawDecorativeLine(&$image, int $x, int $y, int $length, array $colors)
    {
        // 主线条
        $this->drawGradientLine($image, $x, $y, $x + $length, $y, $colors['primary'], $colors['accent']);
        
        // 绘制装饰点
        for ($i = 0; $i < 5; $i++) {
            $dotX = (int)($x + ($length / 6) * ($i + 1));
            $this->drawSoftCircle($image, $dotX, $y, 3, $colors['accent'], 30);
        }
    }

    /**
     * 绘制水印
     * @param resource $image 图像资源
     * @param string $text 水印文字
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param int $color 颜色
     */
    private function drawWatermark(&$image, string $text, int $x, int $y, int $color)
    {
        $this->drawStyledText($image, $text, $color, 9, $x, $y);
    }

    /**
     * 绘制位置图标
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param int $color 颜色
     */
    private function drawLocationIcon(&$image, int $x, int $y, int $color)
    {
        // 绘制简化的位置图标
        imagefilledellipse($image, $x, $y, 8, 8, $color);
        imagefilledrectangle($image, $x - 1, $y + 2, $x + 1, $y + 8, $color);
    }

    /**
     * 绘制圆角边框
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param int $width 宽度
     * @param int $height 高度
     * @param int $radius 圆角半径
     * @param int $color 边框颜色
     */
    private function drawRoundedBorder(&$image, int $x, int $y, int $width, int $height, int $radius, int $color)
    {
        // 绘制四条边
        imageline($image, $x + $radius, $y, $x + $width - $radius, $y, $color); // 顶边
        imageline($image, $x + $radius, $y + $height, $x + $width - $radius, $y + $height, $color); // 底边
        imageline($image, $x, $y + $radius, $x, $y + $height - $radius, $color); // 左边
        imageline($image, $x + $width, $y + $radius, $x + $width, $y + $height - $radius, $color); // 右边
        
        // 绘制四个角的圆弧（简化处理）
        imagearc($image, $x + $radius, $y + $radius, $radius * 2, $radius * 2, 180, 270, $color);
        imagearc($image, $x + $width - $radius, $y + $radius, $radius * 2, $radius * 2, 270, 360, $color);
        imagearc($image, $x + $radius, $y + $height - $radius, $radius * 2, $radius * 2, 90, 180, $color);
        imagearc($image, $x + $width - $radius, $y + $height - $radius, $radius * 2, $radius * 2, 0, 90, $color);
    }

    /**
     * 绘制美化文字
     * @param resource $image 图像资源
     * @param string $text 文字内容
     * @param int $color 颜色
     * @param int $fontSize 字体大小
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param bool $bold 是否加粗
     */
    private function drawStyledText(&$image, string $text, int $color, int $fontSize, int $x, int $y, bool $bold = false)
    {
        // 为了支持中文显示，使用UTF-8编码处理
        $text = mb_convert_encoding($text, 'UTF-8', 'auto');
        
        // 由于字体文件缺失，使用内置字体
        $fontId = $this->getFontSize($fontSize, $bold);
        
        // 调整Y坐标以适应内置字体
        $adjustedY = (int)($y - ($fontSize / 2));
        
        // 为了更好的中文显示，使用imagettftext并检查系统字体
        if ($this->useSystemFont($image, $text, $color, $fontSize, $x, $y, $bold)) {
            return; // 成功使用系统字体
        }
        
        // 备用方案：使用内置字体
        imagestring($image, $fontId, $x, $adjustedY, $text, $color);
        
        // 如果需要加粗效果，绘制多次
        if ($bold) {
            imagestring($image, $fontId, $x + 1, $adjustedY, $text, $color);
            imagestring($image, $fontId, $x, $adjustedY + 1, $text, $color);
            imagestring($image, $fontId, $x + 1, $adjustedY + 1, $text, $color);
        }
    }

    /**
     * 尝试使用系统字体或备用字体
     * @param resource $image 图像资源
     * @param string $text 文字内容
     * @param int $color 颜色
     * @param int $fontSize 字体大小
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param bool $bold 是否加粗
     * @return bool 是否成功使用系统字体
     */
    private function useSystemFont(&$image, string $text, int $color, int $fontSize, int $x, int $y, bool $bold)
    {
        // 尝试使用常见的中文字体路径
        $possibleFonts = [
            'C:\\Windows\\Fonts\\simhei.ttf',      // Windows 黑体
            'C:\\Windows\\Fonts\\simsun.ttc',      // Windows 宋体
            'C:\\Windows\\Fonts\\msyh.ttc',       // 微软雅黑
            '/System/Library/Fonts/Arial Unicode MS.ttf', // macOS
            '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', // Linux
        ];
        
        foreach ($possibleFonts as $fontPath) {
            if (file_exists($fontPath) && filesize($fontPath) > 1024) {
                try {
                    imagettftext($image, $fontSize, 0, $x, $y, $color, $fontPath, $text);
                    if ($bold) {
                        imagettftext($image, $fontSize, 0, $x + 1, $y, $color, $fontPath, $text);
                        imagettftext($image, $fontSize, 0, $x, $y + 1, $color, $fontPath, $text);
                    }
                    return true;
                } catch (Exception $e) {
                    continue; // 尝试下一个字体
                }
            }
        }
        
        return false; // 所有字体都失败
    }

    /**
     * 根据字体大小和是否加粗选择合适的内置字体
     * @param int $fontSize 字体大小
     * @param bool $bold 是否加粗
     * @return int 字体ID
     */
    private function getFontSize(int $fontSize, bool $bold = false)
    {
        // 根据字体大小映射到内置字体 (1-5)
        if ($fontSize <= 8) {
            return $bold ? 2 : 1;
        } elseif ($fontSize <= 12) {
            return $bold ? 3 : 2;
        } elseif ($fontSize <= 16) {
            return $bold ? 4 : 3;
        } elseif ($fontSize <= 20) {
            return $bold ? 5 : 4;
        } else {
            return 5; // 最大字体
        }
    }

    /**
     * 检查并创建输出目录
     */
    private function checkOutputDir()
    {
        if (!is_dir(self::OUTPUT_DIR)) {
            mkdir(self::OUTPUT_DIR, 0755, true);
        }
    }
    
    /**
     * 绘制现代化默认Logo
     * @param resource $image 图像资源
     * @param int $x X坐标
     * @param int $y Y坐标
     * @param int $color 主色调
     */
    private function drawModernDefaultLogo(&$image, int $x, int $y, int $color)
    {
        // 绘制圆角矩形背景
        $this->drawRoundedRect($image, $x, $y, self::LOGO_SIZE, self::LOGO_SIZE, 15, $color);
        
        // 绘制白色装饰元素
        $white = imagecolorallocate($image, 255, 255, 255);
        
        // 绘制现代化图标（类似公司Logo的抽象设计）
        $centerX = $x + self::LOGO_SIZE / 2;
        $centerY = $y + self::LOGO_SIZE / 2;
        
        // 绘制三个同心圆
        $this->drawCircle($image, $centerX - 20, $centerY - 10, 15, $white);
        $this->drawCircle($image, $centerX + 10, $centerY - 10, 15, $white);
        $this->drawCircle($image, $centerX - 5, $centerY + 15, 15, $white);
        
        // 绘制公司名称简写
        $text = 'CORP';
        $textX = $x + 25;
        $textY = $y + 85;
        imagestring($image, 3, $textX, $textY, $text, $white);
    }
    
    /**
     * 绘制圆角矩形
     */
    private function drawRoundedRect(&$image, int $x, int $y, int $width, int $height, int $radius, int $color)
    {
        // 绘制主体矩形
        imagefilledrectangle($image, $x + $radius, $y, $x + $width - $radius, $y + $height, $color);
        imagefilledrectangle($image, $x, $y + $radius, $x + $width, $y + $height - $radius, $color);
        
        // 绘制四个角的圆弧
        imagefilledellipse($image, $x + $radius, $y + $radius, $radius * 2, $radius * 2, $color);
        imagefilledellipse($image, $x + $width - $radius, $y + $radius, $radius * 2, $radius * 2, $color);
        imagefilledellipse($image, $x + $radius, $y + $height - $radius, $radius * 2, $radius * 2, $color);
        imagefilledellipse($image, $x + $width - $radius, $y + $height - $radius, $radius * 2, $radius * 2, $color);
    }
    
    /**
     * 绘制圆形
     */
    private function drawCircle(&$image, int $centerX, int $centerY, int $radius, int $color)
    {
        imagefilledellipse($image, $centerX, $centerY, $radius * 2, $radius * 2, $color);
    }
    
    /**
     * 绘制现代化文字
     */
    private function drawModernText(&$image, string $text, int $color, int $fontSize, int $x, int $y, bool $bold = false)
    {
        if ($this->isValidFont(self::FONT_PATH)) {
            imagettftext($image, $fontSize, 0, $x, $y, $color, self::FONT_PATH, $text);
            // 如果需要加粗效果，重复绘制
            if ($bold) {
                imagettftext($image, $fontSize, 0, $x + 1, $y, $color, self::FONT_PATH, $text);
            }
        } else {
            // 使用默认字体
            $fontId = $bold ? 5 : 4;
            imagestring($image, $fontId, $x, $y - $fontSize, $text, $color);
        }
    }
    
    /**
     * 绘制信息项
     */
    private function drawInfoItem(&$image, string $label, string $value, int $x, int $y, int $labelColor, int $valueColor)
    {
        // 绘制小圆点装饰
        imagefilledellipse($image, $x - 15, $y - 5, 8, 8, $labelColor);
        
        // 绘制标签
        $this->drawModernText($image, $label . ':', $labelColor, 14, $x, $y, true);
        
        // 绘制值
        $labelWidth = strlen($label) * 10 + 20; // 估算标签宽度
        $this->drawModernText($image, $value, $valueColor, 14, $x + $labelWidth, $y);
    }
    
    /**
     * 绘制渐变线
     */
    private function drawGradientLine(&$image, int $x1, int $y, int $x2, int $y2, int $startColor, int $endColor)
    {
        $length = $x2 - $x1;
        for ($i = 0; $i < $length; $i++) {
            $ratio = $i / $length;
            // 简单的颜色渐变（这里简化处理）
            $currentColor = $ratio < 0.5 ? $startColor : $endColor;
            imageline($image, $x1 + $i, $y, $x1 + $i, $y2, $currentColor);
        }
    }
    
    /**
     * 绘制底部装饰
     */
    private function drawBottomDecoration(&$image, int $primaryColor, int $lightColor)
    {
        // 绘制底部小元素
        $y = self::CARD_HEIGHT - 40;
        
        // 绘制一系列小圆点
        for ($i = 0; $i < 5; $i++) {
            $x = 50 + $i * 25;
            $color = $i % 2 == 0 ? $primaryColor : $lightColor;
            imagefilledellipse($image, $x, $y, 6, 6, $color);
        }
        
        // 绘制右下角水印
        $watermark = 'BUSINESS CARD';
        $watermarkColor = imagecolorallocate($image, 200, 200, 200);
        imagestring($image, 1, self::CARD_WIDTH - 100, self::CARD_HEIGHT - 15, $watermark, $watermarkColor);
    }

    /**
     * 绘制文本
     * @param resource $image 图像资源
     * @param string $text 文本内容
     * @param int $color 文本颜色
     * @param int $fontSize 字体大小
     * @param int $x X坐标
     * @param int $y Y坐标
     */
    private function drawText(&$image, string $text, int $color, int $fontSize, int $x, int $y)
    {
        // 检查字体文件是否存在且有效
        if ($this->isValidFont(self::FONT_PATH)) {
            imagettftext($image, $fontSize, 0, $x, $y, $color, self::FONT_PATH, $text);
        } else {
            // 如果没有指定字体或字体无效，使用默认字体
            imagestring($image, $fontSize, $x, $y - $fontSize, $text, $color);
        }
    }

    /**
     * 加载图片
     * @param string $imagePath 图片路径
     * @return resource|false 图像资源或false
     */
    private function loadImage(string $imagePath)
    {
        // 首先验证文件是否为有效图片
        if (!$this->isValidImage($imagePath)) {
            return false;
        }
        
        $extension = strtolower(pathinfo($imagePath, PATHINFO_EXTENSION));
        
        try {
            switch ($extension) {
                case 'jpg':
                case 'jpeg':
                    return imagecreatefromjpeg($imagePath);
                case 'png':
                    return imagecreatefrompng($imagePath);
                case 'gif':
                    return imagecreatefromgif($imagePath);
                default:
                    return false;
            }
        } catch (Exception $e) {
            // 图片加载失败，返回false
            return false;
        }
    }
    
    /**
     * 验证是否为有效图片文件
     * @param string $imagePath 图片路径
     * @return bool
     */
    private function isValidImage(string $imagePath)
    {
        // 检查文件是否存在
        if (!file_exists($imagePath)) {
            return false;
        }
        
        // 检查文件大小（小于1KB的可能是占位符）
        if (filesize($imagePath) < 1024) {
            return false;
        }
        
        // 使用getimagesize验证图片格式
        $imageInfo = @getimagesize($imagePath);
        if ($imageInfo === false) {
            return false;
        }
        
        // 检查是否为支持的图片类型
        $supportedTypes = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF];
        return in_array($imageInfo[2], $supportedTypes);
    }
    
    /**
     * 验证字体文件是否有效
     * @param string $fontPath 字体文件路径
     * @return bool
     */
    private function isValidFont(string $fontPath)
    {
        return file_exists($fontPath) && filesize($fontPath) > 1024;
    }

    /**
     * 获取Logo路径
     * @return string Logo路径
     */
    private function getLogoPath()
    {
        // 这里可以从配置中读取Logo路径
        return '/static/images/logo/logo.png';
    }

    // ==================== 新增模板绘制方法 ====================

    /**
     * 绘制个人信息（通用方法）
     */
    private function drawPersonalInfo(&$image, array $cardData, array $colors, int $x, int $y)
    {
        $lineHeight = 35;
        
        // 姓名
        $this->drawStyledText($image, $cardData['name'], $colors['secondary'], 18, $x, $y, true);
        
        // 部门和岗位
        $this->drawStyledText($image, $cardData['department'] . ' · ' . $cardData['position'], $colors['mediumGray'], 14, $x, $y + $lineHeight);
        
        // 电话
        $this->drawStyledText($image, '📱 ' . $cardData['phone'], $colors['text'], 14, $x, $y + $lineHeight * 2);
        
        // 邮箱
        $this->drawStyledText($image, '✉️ ' . $cardData['email'], $colors['text'], 14, $x, $y + $lineHeight * 3);
    }

    /**
     * 创建现代渐变背景
     */
    private function createModernGradientBackground(&$image)
    {
        // 创建从蓝色到紫色的渐变
        for ($y = 0; $y < self::CARD_HEIGHT; $y++) {
            $ratio = $y / self::CARD_HEIGHT;
            $r = (int)(102 + (118 - 102) * $ratio);
            $g = (int)(126 + (75 - 126) * $ratio);
            $b = (int)(234 + (162 - 234) * $ratio);
            
            $color = imagecolorallocate($image, $r, $g, $b);
            imageline($image, 0, $y, self::CARD_WIDTH, $y, $color);
        }
    }

    /**
     * 绘制现代模板左侧区域
     */
    private function drawModernLeftSection(&$image, array $cardData, int $white, int $lightWhite)
    {
        $leftWidth = (int)(self::CARD_WIDTH * 0.4);
        
        // 绘制分割线
        imageline($image, $leftWidth, 0, $leftWidth, self::CARD_HEIGHT, $lightWhite);
        
        // 绘制Logo
        $logoSize = 60;
        $logoX = 30;
        $logoY = 40;
        $this->drawRoundedRect($image, $logoX, $logoY, $logoSize, $logoSize, 30, $lightWhite);
        $this->drawStyledText($image, 'L', $white, 24, $logoX + 20, $logoY + 35, true);
        
        // 绘制姓名和职位
        $this->drawStyledText($image, $cardData['name'], $white, 18, 30, 130, true);
        $this->drawStyledText($image, $cardData['position'], $white, 12, 30, 155);
    }

    /**
     * 绘制现代模板右侧区域
     */
    private function drawModernRightSection(&$image, array $cardData, int $white, int $lightWhite)
    {
        $rightX = (int)(self::CARD_WIDTH * 0.4) + 30;
        
        // 公司名称
        $this->drawStyledText($image, $cardData['company_name'], $white, 16, $rightX, 60, true);
        
        // 联系信息
        $this->drawStyledText($image, '📱 ' . $cardData['phone'], $white, 12, $rightX, 120);
        $this->drawStyledText($image, '✉️ ' . $cardData['email'], $white, 12, $rightX, 145);
        $this->drawStyledText($image, $cardData['department'], $white, 12, $rightX, 170);
    }

    /**
     * 绘制优雅边框
     */
    private function drawElegantBorder(&$image, int $gold)
    {
        // 外边框
        imagerectangle($image, 10, 10, self::CARD_WIDTH - 10, self::CARD_HEIGHT - 10, $gold);
        imagerectangle($image, 11, 11, self::CARD_WIDTH - 11, self::CARD_HEIGHT - 11, $gold);
        
        // 内边框
        imagerectangle($image, 20, 20, self::CARD_WIDTH - 20, self::CARD_HEIGHT - 20, $gold);
    }

    /**
     * 绘制优雅内容
     */
    private function drawElegantContent(&$image, array $cardData, int $darkGray, int $gold, int $lightGray)
    {
        $centerX = (int)(self::CARD_WIDTH / 2);
        
        // 姓名（居中）
        $nameWidth = strlen($cardData['name']) * 10;
        $this->drawStyledText($image, $cardData['name'], $darkGray, 20, $centerX - $nameWidth/2, 80, true);
        
        // 职位（居中，金色）
        $titleText = $cardData['department'] . ' · ' . $cardData['position'];
        $titleWidth = strlen($titleText) * 6;
        $this->drawStyledText($image, $titleText, $gold, 14, $centerX - $titleWidth/2, 110);
        
        // 公司名称（居中）
        $companyWidth = strlen($cardData['company_name']) * 8;
        $this->drawStyledText($image, $cardData['company_name'], $darkGray, 16, $centerX - $companyWidth/2, 140);
        
        // 联系信息（居中）
        $phoneWidth = strlen($cardData['phone']) * 6;
        $this->drawStyledText($image, '📱 ' . $cardData['phone'], $lightGray, 12, $centerX - $phoneWidth/2, 180);
        
        $emailWidth = strlen($cardData['email']) * 6;
        $this->drawStyledText($image, '✉️ ' . $cardData['email'], $lightGray, 12, $centerX - $emailWidth/2, 200);
    }

    /**
     * 创建创意渐变背景
     */
    private function createCreativeGradientBackground(&$image)
    {
        // 创建从红色到黄色的渐变
        for ($y = 0; $y < self::CARD_HEIGHT; $y++) {
            $ratio = $y / self::CARD_HEIGHT;
            $r = (int)(255 + (254 - 255) * $ratio);
            $g = (int)(107 + (202 - 107) * $ratio);
            $b = (int)(107 + (87 - 107) * $ratio);
            
            $color = imagecolorallocate($image, $r, $g, $b);
            imageline($image, 0, $y, self::CARD_WIDTH, $y, $color);
        }
    }

    /**
     * 绘制创意装饰元素
     */
    private function drawCreativeDecorations(&$image)
    {
        $lightWhite = imagecolorallocatealpha($image, 255, 255, 255, 80);
        
        // 右上角圆形
        imagefilledellipse($image, self::CARD_WIDTH - 60, 60, 80, 80, $lightWhite);
        
        // 左下角三角形（简化为矩形）
        imagefilledrectangle($image, 0, self::CARD_HEIGHT - 40, 40, self::CARD_HEIGHT, $lightWhite);
    }

    /**
     * 绘制创意内容
     */
    private function drawCreativeContent(&$image, array $cardData, int $white, int $lightWhite)
    {
        // 姓名
        $this->drawStyledText($image, $cardData['name'], $white, 18, 50, 80, true);
        
        // 职位
        $this->drawStyledText($image, $cardData['position'], $white, 14, 50, 110);
        
        // 公司
        $this->drawStyledText($image, $cardData['company_name'], $white, 14, 50, 140);
        
        // 联系信息
        $this->drawStyledText($image, '📱 ' . $cardData['phone'], $white, 12, 50, 180);
        $this->drawStyledText($image, '✉️ ' . $cardData['email'], $white, 12, 50, 200);
        $this->drawStyledText($image, $cardData['department'], $white, 12, 50, 220);
    }

    /**
     * 绘制极简内容
     */
    private function drawMinimalContent(&$image, array $cardData, int $darkGray, int $lightGray, int $accent)
    {
        // 姓名和装饰线
        $this->drawStyledText($image, $cardData['name'], $darkGray, 20, 50, 80, true);
        imagefilledrectangle($image, 50, 90, 110, 93, $accent);
        
        // 职位
        $this->drawStyledText($image, $cardData['department'] . ' · ' . $cardData['position'], $lightGray, 14, 50, 120);
        
        // 公司
        $this->drawStyledText($image, $cardData['company_name'], $darkGray, 14, 50, 150);
        
        // 联系信息
        $this->drawStyledText($image, '📱 ' . $cardData['phone'], $lightGray, 12, 50, 190);
        $this->drawStyledText($image, '✉️ ' . $cardData['email'], $lightGray, 12, 50, 210);
    }

    /**
     * 创建多彩渐变背景
     */
    private function createMultiGradientBackground(&$image)
    {
        // 创建从蓝色到紫色到粉色的渐变
        for ($y = 0; $y < self::CARD_HEIGHT; $y++) {
            $ratio = $y / self::CARD_HEIGHT;
            
            if ($ratio < 0.5) {
                // 蓝色到紫色
                $localRatio = $ratio * 2;
                $r = (int)(102 + (118 - 102) * $localRatio);
                $g = (int)(126 + (75 - 126) * $localRatio);
                $b = (int)(234 + (162 - 234) * $localRatio);
            } else {
                // 紫色到粉色
                $localRatio = ($ratio - 0.5) * 2;
                $r = (int)(118 + (240 - 118) * $localRatio);
                $g = (int)(75 + (147 - 75) * $localRatio);
                $b = (int)(162 + (251 - 162) * $localRatio);
            }
            
            $color = imagecolorallocate($image, $r, $g, $b);
            imageline($image, 0, $y, self::CARD_WIDTH, $y, $color);
        }
    }

    /**
     * 绘制渐变内容
     */
    private function drawGradientContent(&$image, array $cardData, int $white, int $lightWhite)
    {
        // 姓名（带阴影效果）
        $shadowColor = imagecolorallocatealpha($image, 0, 0, 0, 60);
        $this->drawStyledText($image, $cardData['name'], $shadowColor, 18, 52, 82, true);
        $this->drawStyledText($image, $cardData['name'], $white, 18, 50, 80, true);
        
        // 职位
        $this->drawStyledText($image, $cardData['position'], $white, 14, 50, 110);
        
        // 公司
        $this->drawStyledText($image, $cardData['company_name'], $white, 14, 50, 140);
        
        // 联系信息
        $this->drawStyledText($image, '📱 ' . $cardData['phone'], $white, 12, 50, 180);
        $this->drawStyledText($image, '✉️ ' . $cardData['email'], $white, 12, 50, 200);
        $this->drawStyledText($image, $cardData['department'], $white, 12, 50, 220);
    }
}